"""列表"""""

'''定义'''
# 列表是一个容器序列，它可以存储任何数据类型，列表中每个元素使用英文逗号分隔
# 表示方法 [1,2,3,4,[5,6]]，在python中是list关键字表示列表
ls1 = [1, 2, 3, 4, [5, 6]]
# print(type(ls1)) # <class 'list'>
ls2 = list([1, 2, 3])
# print(ls2) # [1, 2, 3]

'''特性'''
# 可变(内存的地址不变,并且改变后的数据就是改变了)的数据类型，因为可变可以对它增删改，有序的，因为有序可以索引切片，可遍历的，因为列表是可迭代对象
ls3 = [1, 2, 4]
print(ls3, id(ls3))  # [1, 2, 4] 2328153952000
ls3[2] = 3
print(ls3, id(ls3))  # [1, 2, 3] 2328153952000

# 可迭代对象有__iter__方法 (dir)查看对象的所有属性和方法,只有可迭代对象才能遍历
print(dir(ls3))
print(dir('1234'))
print(dir(1))  # 数字不是 可迭代对象

# 可遍历就是可以对该对象进行循环

'''列表推导式'''
# 列表推导式 以 简洁的方式 动态生成列表,但列表深度很深时，不会发生内存泄漏
ls3 = []
for i in range(101):
    if i % 2 == 0:
        ls3 += [i]
print(ls3)

# 列表推导式的格式1： [i for i in iter(可迭代对象) if 条件1]
ls4 = [i for i in range(101) if i % 2 == 0]
print(ls4)
# 列表推导式的格式2： [value1 if 条件1 elif 条件2 value2 else value3 for i in iter]
# 有一个字符串：'asdasd3wfds1213341+4=231',将里边的小写转换为大写字母，并输出转换后的字符串，元素间顺序不变
str1 = 'asdasd3wfds1213341+4=231'
result = []
for i in str1:
    if 'a' <= i <= 'z':
        result += [chr(ord(i) - 32)]
    else:
        result += [i]
print(''.join(result))  # ASDASD3WFDS1213341+4=231
result1 = [chr(ord(i) - 32) if 'a' <= i <= 'z' else i for i in str1]
print(''.join(result1))

'''常用方法'''
ls5 = [1, 2, 3]
ls6 = [4, 5]
print(ls5 + ls6)  # [1, 2, 3, 4, 5]

# 1、append(obj) 在列表的尾部添加元素obj,直接写元素,本身就是修改列表不返回值，返回的是none
ls5.append(4) # [1, 2, 3, 4]
print(ls5)

# 2、extend(obj) 在列表尾部新增多个元素，obj只能是可迭代对象,不能单独加一个4，因为他是可迭代的
ls5.extend([5,6,7])
print(ls5) # [1, 2, 3, 4, 5, 6, 7]

# 3、pop(索引号) 删除指定的元素，如果不写索引号，默认删除列表中最后一个元素
ls5.pop()
print(ls5) # [1, 2, 3, 4, 5, 6]
ls5.pop(2)
print(ls5) # [1, 2, 4, 5, 6]

# 4、remove(element) 删除指定的元素(不是索引号了)，如果指定有多个，只删第一个
ls5.append(1)
ls5.remove(1)
print(ls5) # [2, 4, 5, 6, 1]

# 5、insert(索引号,新的元素) 在索引号前 插入元素
ls5.insert(1,3)
print(ls5) # [2, 3, 4, 5, 6, 1]

# 6、index(元素) 查询元素在列表中的位置,查询可以直接输出
print(ls5.index(1)) # 5

# 7、reverse() 将列表反转
ls5.reverse()
print(ls5) # [1, 6, 5, 4, 3, 2]

# 8、对元素进行修改,写索引位置(不常用)
ls5[2] ='a'
print(ls5) # [1, 6, 'a', 4, 3, 2]